home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 June: Reference Library / Dev.CD Jun 99 RL Disk 1.toast / Technical Documentation / Macintosh Technotes and Q&As / technotes / tn / tn_1038.PDD < prev    next >
Encoding:
Text File  |  1997-12-10  |  19.7 KB  |  288 lines  |  [TEXT/R*ch]

  1. N∞ÿ ÿÿÿÿ(Ú ÿÄÿ◊
  2. √°"ó•ó•#
  3. U°#ªª
  4. ÿÜÿÜUÔ, Palatino
  5. .+BK›
  6. ) 
  7. (÷BT E C H N O T E :*#QuickDraw GX OffscreenLibrary.c in *(Detail: Description, Uses  & Limitations
  8. *3
  9. By Cary Clarkªª,Times* cary@artemis.com* Apple Emeritus*This Technote discusses ,    Geneva
  10. )lOffscreenLibrary.c
  11. )G" from the QuickDraw GX Libraries. (ˆBJThis Note is intended for Macintosh QuickDraw GX developers who implement * .flickerless drawing or double buffering using 
  12. )ÉOffscreenLibrary.c
  13. )G  or who are (®BBconsidering using it for their QuickDraw GX graphics applications.33ÿÿ
  14. (îAbout the GX Libraries
  15. +BKFor better or worse, the development of QuickDraw GX took seven years from * Nconception to initial release. During that time, there were many requests for * Lfeature enhancements and interface improvements that, if implemented, might * Hhave taken seven more years to complete. As it turns out, some of these * Senhancements could readily be built on existing services, but there was no time to * Stest or document these services with the rigor required to make them fully part of * the released system. ‡ª
  16. 2°##ªª
  17. ÿÜÿÜ2Ô,     Helvetica"
  18.     ($C\Technote 1038    ///          Release 1.0       © 1996   Apple Computer, Inc.      ///      )Ü4/1/96)        ///          Page )*1) of  7ÿ•'/ Apple Computer Helvetica Regular(B•B∞B…Î+ÍapplRGB mntrappl&®Í{i•i˜C$Á'wSãƒØ˙T44447„€ñx8    - V
  19. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  20. å„î=÷ ÿÿ7„€ñx8    - V
  21. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  22. å„î=÷ ÿÿ7„€ñx8    - V
  23. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  24. å„î=÷ ÿÿApple Multiple Scan 17 - D50)Fî*#-pictÁÚ(    E  hB•$B≠B™(B•B∞)Fî*Q@@-cnfoÿù-cnfoŸ¿C™?ÿ ÿÿÿÿ(Ú ÿÄÿ◊
  25. √°"ó•ó• √
  26. √°# ‡x
  27. U°#
  28. ÿÜÿÜUÔ, Palatino
  29. .+B    TThe GX Libraries fill this gap by providing services built on top of the rest of GX * Kin source form. This Technote and others document these services. Since GX * Tlibraries are provided as source, it is reasonable for developers to modify them to * Qmeet their specific needs. Care was taken for the libraries not to depend on the * Gimplementation details of GX, so that future versions of GX should not * .invalidate them, in original or modified form.*MThe libraries are likely to evolve to take advantage of improved algorithms, * Pnew Macintosh or GX services; if you modify one for your applicationÕs specific * Mneeds, itÕs worth occasionally reviewing the GX library provided by Apple to * (stay synchronized with any improvements.ªª,     Helvetica
  30. *)What are Offscreens?
  31. *Slick graphics )Dapplications attempt to)l# draw animations seamlessly to the (ÏBJscreen, without flashing or flickering. QuickDraw GX provides a number of * Mstrategies that change these distractions into attractions. The most popular * method to eliminate flickering)‘1 is double buffering; the application draws into (óBMone bitmap while the computer displays a second bitmap. The bitmap receiving * Fthe drawing that will be displayed momentarily is called an offscreen.ªª
  32. *)What is in OffscreenLibrary.c?
  33. *The GX Library, ,    Geneva
  34. )LOffscreenLibrary.c
  35. )G1, provides utility functions to implement double (SBMbuffering; it creates bitmaps that in turn are imaged by GX Graphics. It was * Owritten primarily by Oliver Steele, with contributions from the rest of the GX * Graphics team. 
  36. *OffscreenLibrary.c
  37. )GC has two distinct groups of functions. The simpler revolves around (≈BQthe offscreen struct, and provides a single bitmap for back buffering. The other * Pset uses a viewPortBuffer to support multiple offscreens that correspond to the * Fportions of a window that spans multiple monitors of different depths.33ÿÿ
  38. (ÏUsing OffscreenLibrary.cªª
  39. +B-'The One Shot Solution: Struct offscreen
  40. * The meat of 
  41. )8Offscreenlibrary.c
  42. )D is this struct:
  43. (9Cstruct offscreen {+ >gxShape       draw    /* a bitmap which, when drawn, transfers ‡ª
  44. 2°##ªª
  45. ÿÜÿÜ2Ô"
  46.     ($C\Technote 1038    ///          Release 1.0       © 1996   Apple Computer, Inc.      ///      )Ü4/1/96)        ///          Page )*2) of  7ÿ•'/ Apple Computer Helvetica Regular(B•B∞B…Î+ÍapplRGB mntrappl&®Í{i•i˜C$Á'wSãƒØ˙T44447„€ñx8    - V
  47. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  48. å„î=÷ ÿÿ7„€ñx8    - V
  49. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  50. å„î=÷ ÿÿ7„€ñx8    - V
  51. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  52. å„î=÷ ÿÿApple Multiple Scan 17 - D50)Fî*#-pictÁÚ(
  53. ª    E  hB•$B≠B™(B•B∞)Fî*Q@@-cnfoÿù-cnfoŸ¿C™?ÿ ÿÿÿÿ(Ú ÿÄÿ◊
  54. √°"ó•ó• 
  55. ˘°# ú›
  56. U°#
  57. ÿÜÿÜUÔ,    Geneva
  58. .+Δ    the offscreen to the display */(V=gxTransform   xform;  /* this causes shapes owning it to draw(!C*                             offscreen. */+ ?gxViewDevice  device; /* the offscreen device whose colorSpace,(9C3                             etc. you may change */+ ?gxViewPort    port;   /* the offscreen port which may be put in(QC=                             any transform's viewPort list */+ ?gxViewGroup   group;  /* the global space in which the viewPort(iC4                             and viewDevice exist */* };, Palatino
  59. (ŸBand these functions:
  60. +=void CreateOffscreen(offscreen *target, gxShape bitmapShape);
  61. (ÃBUse 
  62. )CreateOffscreen
  63. )@  to fill in)(6 the offscreen struct, given the bitmap shape to back (ÏBup.
  64. +)void DisposeOffscreen(offscreen *target);
  65. (B,When youÕre through with the offscreen, use 
  66. )ËDisposeOffscreen
  67. )E to get rid of the (Bpieces.
  68. +3void CopyToBitmaps(gxShape target, gxShape source);
  69. (GB#To copy one bitmap to another, use 
  70. CopyToBitmaps
  71. )=.(YBTGX makes it pretty darn easy to create an offscreen. For instance, you can create a * 6bitmap that contains a diagonal line with these calls:
  72. +0gxLine aLine = {ff(20), ff(40), ff(60), ff(80)};* %gxShape lineBits = GXNewLine(&aLine);* 'GXSetShapeType(lineBits, gxBitmapType);
  73. (“B2Then, to create an offscreen from the line bitmap:
  74. +offscreen offLine;* #CreateOffscreen(offLine, lineBits);
  75. (õB"You can draw the line bitmap with:
  76. +GXDrawShape(offLine.draw);
  77. (+B@To add a rectangle to the line bitmap, first create a rectangle:
  78. +5gxRectangle aRect = {ff(50), ff(50), ff(60), ff(60)}; ‡ª
  79. 2°##ªª
  80. ÿÜÿÜ2Ô,     Helvetica"
  81.     ($C\Technote 1038    ///          Release 1.0       © 1996   Apple Computer, Inc.      ///      )Ü4/1/96)        ///          Page )*3) of  7ÿ•'/ Apple Computer Helvetica Regular(B•B∞B…Î+ÍapplRGB mntrappl&®Í{i•i˜C$Á'wSãƒØ˙T44447„€ñx8    - V
  82. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  83. å„î=÷ ÿÿ7„€ñx8    - V
  84. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  85. å„î=÷ ÿÿ7„€ñx8    - V
  86. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  87. å„î=÷ ÿÿApple Multiple Scan 17 - D50)Fî*#-pictÁÚ(¢    E  hB•$B≠B™(B•B∞)Fî*Q@@-cnfoÿù-cnfoŸ¿C™?ÿ ÿÿÿÿ(Ú ÿÄÿ◊
  88. √°"ó•ó• ˘
  89.  °# øh
  90. U°#
  91. ÿÜÿÜUÔ,    Geneva
  92. .+V    +gxShape rectToAdd = GXNewRectangle(&aRect);, Palatino
  93. (!B<Then change the rectangle to the transform in the offscreen:
  94. +.GXSetShapeTransform(rectToAdd, offLine.xform);* GXDrawShape(rectToAdd);
  95. (cBGNow, drawing the line bitmap will draw both the line and the rectangle:
  96. +GXDrawShape(lineBits);
  97. (˙BOnce youÕre done, you can use 
  98. )∞DisposeOffscreen
  99. )E to get rid of it:
  100. (·VDisposeOffscreen(&offLine);
  101. (ÏB
  102. The function 
  103. ):
  104. CopyToBitmaps
  105. )=5 uses the offscreen structure internally to copy one (ÛBLbitmap onto another. The name is somewhat misleading, since the shape to be * Rcopied can be any shape type, not necessarily a bitmap. For instance, you can use * Cit to create a bitmap that has a specific bit depth from a picture:
  106. +3static gxShape Create8BitPicture(gxShape myPicture)* {+ gxRectangle bounds;(5V&// get the bounding box of the picture+ (GXGetShapeBounds(myPicture, 0, &bounds);(MV?// move the picture so that itÕs upper left corner is at (0, 0)+ 2GXMoveShape(myPicture, -bounds.left, -bounds.top);(eV1// create a bitmap big enough to hold the picture+ =gxShape bitmap = {nil, FixRound(bounds.right - bounds.left), + ;FixRound(bounds.bottom - bounds.top), 0, 8, nil, nil, nil};(≈V!// copy the picture to the bitmap+ !CopyToBItmaps(bitmap, myPicture);(¡V5// move the bitmap to the pictureÕs original position+ 0GXMoveShape(myPicture, bounds.left, bounds.top);(’V*// restore the pictureÕs original position+ -GXMoveShape(bitmap, bounds.left, bounds.top);* return bitmap;(†V}ªª,     Helvetica
  107. ( B,The ViewPortBuffer Multiple Offscreen Scheme
  108. *MThe Macintosh is relatively unique among computers in that it allows windows * Oto straddle two or more monitors at the same time. QuickDraw GX fully embraces * Sthis capability, and takes it to the logical extreme; not only can viewPorts cross * Mmultiple viewDevices, but the viewDevices themselves can overlap each other.  ‡ª
  109. 2°##ªª
  110. ÿÜÿÜ2Ô"
  111.     ($C\Technote 1038    ///          Release 1.0       © 1996   Apple Computer, Inc.      ///      )Ü4/1/96)        ///          Page )*4) of  7ÿ•'/ Apple Computer Helvetica Regular(B•B∞B…Î+ÍapplRGB mntrappl&®Í{i•i˜C$Á'wSãƒØ˙T44447„€ñx8    - V
  112. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  113. å„î=÷ ÿÿ7„€ñx8    - V
  114. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  115. å„î=÷ ÿÿ7„€ñx8    - V
  116. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  117. å„î=÷ ÿÿApple Multiple Scan 17 - D50)Fî*#-pictÁÚ(    ª    E  hB•$B≠B™(B•B∞)Fî*Q@@-cnfoÿù-cnfoŸ¿C™?ÿ ÿÿÿÿ(Ú ÿÄÿ◊
  118. √°"ó•ó•
  119.  
  120.  
  121.   ¨°# õà
  122. U°#
  123. ÿÜÿÜUÔ, Palatino
  124. .+B    MThis makes allocating an offscreen bitmap a challenge, since there may be no * Qsingle best depth that allows drawing to contain the correct amount of color and * 8draw as quickly as possible. The solution provided by a ,    Geneva
  125. )ûviewPortBuffer
  126. );  creates a (-BJpicture containing an array of offscreens that match the desired multiple * viewDevices.*HereÕs the interface to 
  127. )hviewPortBuffer
  128. );. 
  129. (iV5typedef struct viewPortBufferRecord **viewPortBuffer;
  130. (™BThe 
  131. )viewPortBuffer
  132. );> is a blind handle that points to the internals kept by these (ŸBQroutines. It is never necessary to directly access the fields pointed to by this * handle.
  133. +:viewPortBuffer NewViewPortBuffer(gxViewPort originalPort);
  134. (ÏBKTo create an offscreen for a window that may cross multiple monitors, call * NNewViewPortBuffer. It takes the windowÕs viewPort, returns a reference to the * @internal structure. The windowÕs viewPort can be retrieved from 
  135. * GXGetWindowViewPort
  136. )[.
  137. (V2void DisposeViewPortBuffer(viewPortBuffer target);
  138. ()B When the window is closed, call 
  139. )DisposeViewPortBuffer
  140. )[ to get deallocate the (5B"internal objects allocated by the 
  141. )„viewPortBuffer
  142. );.
  143. (SV<gxViewPort GetViewPortBufferViewPort(viewPortBuffer source);
  144. (kB.To draw shapes into the offscreen, first call 
  145. )ÆGetViewPortBufferViewPort
  146. )n. 
  147. (wBGetViewPortBufferViewPort
  148. )n1 returns a viewPort that references the multiple (∞BRoffscreens. Drawing into this viewPort draws into as many offscreen bitmaps as is * Pappropriate. To attach this viewPort to a single shape, use the library routine 
  149. * SetShapeViewPort
  150. )J,. To change all shapes of a given type, try 
  151. )≤SetTransformViewPort( (§B"GXGetDefaultTransform( theType ));+6gxShape GetViewPortBufferShape(viewPortBuffer source);
  152. (†BTo draw the offscreens, call 
  153. )~GetViewPortBufferShape
  154. )b to get the shape to draw. (éBNDrawing the returned shape transfers the offscreen bitmaps to the viewDevices * Epointed to by the original viewPort, typically the windowÕs viewPort.
  155. +3Boolean ValidViewPortBuffer(viewPortBuffer target);
  156. (+BKThe user may foul things up by changing the monitors depth or the windowÕs * .position. After a window-altering event, call 
  157. )ÎValidViewPortBuffer
  158. )O to see if the 
  159. (CBviewPortBuffer
  160. ); needs to be recomputed. ‡ª
  161. 2°##ªª
  162. ÿÜÿÜ2Ô,     Helvetica"
  163.     ($C\Technote 1038    ///          Release 1.0       © 1996   Apple Computer, Inc.      ///      )Ü4/1/96)        ///          Page )*5) of  7ÿ•'/ Apple Computer Helvetica Regular(B•B∞B…Î+ÍapplRGB mntrappl&®Í{i•i˜C$Á'wSãƒØ˙T44447„€ñx8    - V
  164. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  165. å„î=÷ ÿÿ7„€ñx8    - V
  166. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  167. å„î=÷ ÿÿ7„€ñx8    - V
  168. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  169. å„î=÷ ÿÿApple Multiple Scan 17 - D50)Fî*#-pictÁÚ( æ    E  hB•$B≠B™(B•B∞)Fî*Q@@-cnfoÿù-cnfoŸ¿C™?ÿ ÿÿÿÿ(Ú ÿÄÿ◊
  170. √°"ó•ó• ¨
  171. ¨0°# óX
  172. U°#
  173. ÿÜÿÜUÔ,    Geneva
  174. .+V    4Boolean UpdateViewPortBuffer(viewPortBuffer target);, Palatino
  175. (!BIf the 
  176. )viewPortBuffer
  177. ); is out of date, 
  178. )AUpdateViewPortBuffer
  179. )X will put things right (-Bagain. It returns true if the 
  180. )zviewPortBuffer
  181. ); was already valid.(?BIHereÕs a convoluted example that builds the offscreens and draws a shape.
  182. +7static void BufferDraw(gxShape shape, WindowPtr window)* {* I// create the viewPortBuffer from the viewPort associated with the window+ viewPortBuffer buffer =+` /NewViewPortBuffer(GXGetWindowViewPort(window));(˙CG// retrieve the viewPort created that allows drawing into the offscreen+ ;viewPort offscreenPort = GetViewPortBufferViewPort(buffer);(±C$// point the shape to that offscreen+ 'SetShapeViewPort(shape, offscreenPort);(ÉC$// draw the shape into the offscreen+ GXDrawShape(shape);(áC%// draw the offscreen into the window+ ,GXDrawShape(GetViewPortBufferShape(buffer));(ùC// throw the offscreen away+ DisposeViewPortBuffer(buffer);(C}ªª,     Helvetica
  183. (:BHow the ViewPortBuffer Works
  184. *
  185. Since the 
  186. ),viewPortBuffer
  187. );4 is implemented as a library, you can read the code (eB3yourself; youÕll find it is pretty straightforward.*-The implementation is split into a few steps:+1.)    5Figure out which devices the window/viewPort crosses.(§E2.)    LFor each device, figure out the coordinates for the viewPort on that device.(¿E3.)    LCreate a bitmap that has the same pixel depth, color set, color profile and * (color space as the corresponding device.(ãE4.)    OKeep track of the allocations and object references so that closing the window * L(or disposing the device) doesnÕt leave any dangling references or pointers.33ÿÿ
  188. ( Summary
  189. +BKGX Libraries contain a wealth of information and show how to use QuickDraw * GX to solve real problems. 
  190. )xOffscreenLibrary.c
  191. )G" shows how to use GX to construct (9BNflickerless drawing by implementing double buffering on a single device or on * multiple devices. ‡ª
  192. 2°##ªª
  193. ÿÜÿÜ2Ô"
  194.     ($C\Technote 1038    ///          Release 1.0       © 1996   Apple Computer, Inc.      ///      )Ü4/1/96)        ///          Page )*6) of  7ÿ•'/ Apple Computer Helvetica Regular(B•B∞B…Î+ÍapplRGB mntrappl&®Í{i•i˜C$Á'wSãƒØ˙T44447„€ñx8    - V
  195. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  196. å„î=÷ ÿÿ7„€ñx8    - V
  197. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  198. å„î=÷ ÿÿ7„€ñx8    - V
  199. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  200. å„î=÷ ÿÿApple Multiple Scan 17 - D50)Fî*#-pictÁÚ(    ü    E  hB•$B≠B™(B•B∞)Fî*Q@@-cnfoÿù-cnfoŸ¿C™?ÿ ÿÿÿÿ(Ú ÿÄÿ◊
  201. √°"ó•ó• 0
  202. 0¸°# ›‹
  203. U°#ªª
  204. ÿÜÿÜUÔ,     Helvetica
  205. .+B Further Reference,
  206.  
  207. Zapf Dingbats
  208. *n, Palatino
  209. ) CMacOS SDK CD, Development Kits (Disc 1): QuickDraw GX: Programming * Stuff: GX Libraries:
  210. (BBn
  211. ) &Inside Macintosh: QuickDraw GX Objects
  212. 
  213. (ZBn
  214. ) 8Inside Macintosh: QuickDraw GX Environment and Utilitiesªª
  215. (}BAcknowledgments
  216. *EThanks to Tom Dowdy, Rob Johnson and Ingrid Kelly for reviewing this * NTechnote. Special thanks to Michael Fairman for proving that graphics is more * than what you can draw. ‡ª
  217. 2°##ªª
  218. ÿÜÿÜ2Ô"
  219.     ($C\Technote 1038    ///          Release 1.0       © 1996   Apple Computer, Inc.      ///      )Ü4/1/96)        ///          Page )*7) of  7ÿ•'/ Apple Computer Helvetica Regular(B•B∞B…Î+ÍapplRGB mntrappl&®Í{i•i˜C$Á'wSãƒØ˙T44447„€ñx8    - V
  220. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  221. å„î=÷ ÿÿ7„€ñx8    - V
  222. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  223. å„î=÷ ÿÿ7„€ñx8    - V
  224. “Côdâ#⁄'f+k/ˇ3ù8≠=4BGLJQ€W(\Ôb©hœnÊu{—≠&√è∂‹ˆßı¥q¬ò´˙πfÄXÌoÔ¬†
  225. å„î=÷ ÿÿApple Multiple Scan 17 - D50)Fî*#-pictÁÚ(    E  hB•$B≠B™(B•B∞)Fî*Q@@-cnfoÿù-cnfoŸ¿C™?——Q—~—*“—9$—E«—Kø